<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>逻辑运算符(Logical operator)</title>
    <!-- 
    在JavaScript中，逻辑运算符用于对布尔值进行逻辑操作。
    主要的逻辑运算符有三个： `&&` （与）、 `||` （或）和 `!` （非）。

    1. 逻辑与（ `&&` ）
    - 语法： `expr1 && expr2` 
    - 功能：如果 `expr1` 为真，则返回 `expr2` 的值；如果 `expr1` 为假，则返回 `expr1` 的值。
    - 短路特性：如果第一个表达式为假，第二个表达式不会被求值。
      let a = true;
      let b = false;
      let result = a && b; // result为false
      let x = 5;
      let y = 10;
      let max = (x > y) && x; // max为false，因为x > y为false

    2. 逻辑或（ `||` ）
    - 语法： `expr1 || expr2` 
    - 功能：如果 `expr1` 为真，则返回 `expr1` 的值；如果 `expr1` 为假，则返回 `expr2` 的值。
    - 短路特性：如果第一个表达式为真，第二个表达式不会被求值。
      let a = true;
      let b = false;
      let result = a || b; // result为true
      let x = 5;
      let y = 10;
      let min = (x < y) || y; // min为true，因为x < y为true

    3. 逻辑非（ `!` ）
    - 语法： `!expr` 
    - 功能：返回布尔值的反值。如果 `expr` 为真，返回 `false` ；如果 `expr` 为假，返回 `true` 。
      let a = true;
      let result = !a; // result为false
      let b = false;
      let result2 = !b; // result2为true

    逻辑运算符的应用
      1. 条件判断：逻辑运算符常用于 `if` 语句中，以组合多个条件。
        let age = 20;
        let hasPermission = true;

        if (age >= 18 && hasPermission) {
            console.log("可以进入");
        } else {
            console.log("不可以进入");
        }

      2. 默认值：逻辑或运算符可以用于设置默认值。
        let username = null;
        let displayName = username || "游客"; // 如果username为null，则displayName为"游客"

    总结:
    -  `&&` ：当且仅当所有操作数都为真时，结果为真。
    -  `||` ：只要有一个操作数为真，结果即为真。
    -  `!` ：取反操作，返回布尔值的相反值。
    -->
  </head>
  <body>
    <script>
      // 1.逻辑与
      let a = true;
      let b = false;
      let result = a && b; // result为false
      console.log(result); // false

      let x = 5;
      let y = 10;
      let max = x > y && x; // max为false，因为x > y为false
      console.log(max); // false

      // 2.逻辑或
      let result2 = a || b; // result为true
      console.log(result2); // true

      let min = x < y || y; // min为true，因为x < y为true
      console.log(min); // true

      // 3.逻辑非
      let result3 = !a; // result为false
      console.log(result3); // false

      let result4 = !b; // result2为true
      console.log(result4); // true

      let message = "Hello";
      console.log(Boolean(message)); // false
      console.log(!Boolean(message)); // true
      console.log(!!message); // true

      // 4.条件判断
      let age = 20;
      let hasPermission = true;

      if (age >= 18 && hasPermission) {
        console.log("可以进入");
      } else {
        console.log("不可以进入");
      }

      // 5.默认值
      let username = null;
      let displayName = username || "游客"; // 如果username为null，则displayName为"游客"

      // 6.逻辑运算符的应用
      let obj = {
        name: "张三",
        age: 18,
        friend: {
          name: "李四",
          age: 20,
          other: function () {
            console.log("other");
          },
        },
      };

      obj && obj.friend && obj.friend.other(); // 调用obj.friend.other()方法
    </script>
  </body>
</html>
